<!DOCTYPE html>
<html lang="zh-cn">
  <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="Zhou Wei <zromyk@163.com>">
  <title>C++STL</title>
  <link rel="shortcut icon" href="/favicon.ico">
  <link rel="stylesheet" href="/style/html/pure.css">
  <link rel="stylesheet" href="/style/html/main.css">
  <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.css">
  <!-- <link rel="stylesheet" href="https://apps.bdimg.com/libs/highlight.js/9.1.0/styles/default.min.css"> -->
<link rel="stylesheet" href="/style/article/highlight/default.min.css">
<link rel="stylesheet" href="/style/article/pell-1.0.6/dist/pell.css">

</head>
<body>
  <div id="menu-background"></div>
  <div id="menu">
    <div class="pure-menu pure-menu-horizontal">
  <ul class="pure-menu-list block-middle">
    <li class="pure-menu-item">
  <a class="pure-menu-heading" href="/index.html">ZROMYK</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/index.html">主页</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/archive/index.html">归档</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/download/index.html">下载</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/feedback/index.html">反馈</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="/public/about/index.html">关于我</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link" href="https://github.com/zromyk"><i class="fa fa-github" style="font-size:32px"></i></a>
</li>

  </ul>
</div>

  </div>
  <div id="layout">
    <div class="content">
      <div id="nav">
    <div id="navigation" class="navigation">
  <ul class="pure-menu-list">
    <li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#_1">一、顺序容器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#1">1. 顺序容器类别</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#2">2. 容器基本操作</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#3">3. 添加元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#4">4. 访问元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#5">5. 删除元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#6">6. 改变容器的大小</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#61">6.1 容器大小管理操作</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#7">7. 容器详细介绍</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#71-vector">7.1 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav5" onclick="animateByNav()" href="#711-vector">7.1.1 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 对象的内存增长方式</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#72-deque">7.2 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#73-list">7.3 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>list</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#74-forward_list">7.4 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#75-array">7.5 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#76-string">7.6 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span></a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#_2">二、关联容器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#1_1">1. 关联容器概述</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#11">1.1 定义关联容器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#12-pair">1.2 pair 类型</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#13">1.3 关联容器额外的类型别名</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#14">1.4 关联容器迭代器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#15">1.5 添加元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#16">1.6 删除元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#17-map-unordered_map">1.7 map 和 unordered_map 的下标操作</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#18">1.8 访问元素</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#_3">三、仿函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav2" onclick="animateByNav()" href="#adapter">四、适配器 Adapter</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#1_2">1. 容器适配器：用于改造容器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#2_1">2. 仿函数适配器：用于改造仿函数</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#11_1">1.1 新型适配器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav3" onclick="animateByNav()" href="#3_1">3. 迭代器适配器：用于改造迭代器</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#31-tuple">3.1 tuple</a>
</li>
<li class="pure-menu-item">
  <a class="pure-menu-link nav4" onclick="animateByNav()" href="#32-traits">3.2 Traits</a>
</li>

  </ul>
</div>

</div>
<div id="content-articles">
  <h1 id="C++STL" class="content-subhead">C++STL</h1>
  <p>
    <span>2021-04-20</span>
    <span><span class="post-category post-category-cpp">C++</span></span>
    <button id="button-markdownEditor" class="pure-button" onclick="markdownEditor()">启用编辑</button>
    <button id="button-save" class="pure-button" onclick="save()">保存</button>
  </p>
  <div id="content-articles-markdownEditor" style="display: none;">
    <h1>编辑 power by pell</h1>
    <div id="editor" class="pell"></div>
    <div style="margin-top:20px;">
        <h3>Text output:</h3>
        <div id="text-output"></div>
    </div>
    <div style="margin-top:20px;">
        <h3>HTML output:</h3>
        <pre id="html-output"></pre>
    </div>
  </div>
  <div id="content-articles-markdown">
    <h2 id="_1">一、顺序容器</h2>
<h3 id="1">1. 顺序容器类别</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>顺序容器</th>
<th>名称</th>
<th>访问规则</th>
<th>访问速度</th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span></td>
<td>可变大小数组</td>
<td>支持快速随机访问</td>
<td>在尾部之外的位置插入或删除元素可能很慢</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span></td>
<td>双端队列</td>
<td>支持快速随机访问</td>
<td>在头尾位置插入、删除速度很快</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>list</code></span></td>
<td>双向链表</td>
<td>只支持双向顺序访问</td>
<td>在 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>list</code></span> 中任何位置进行插入 / 删除操作速度都很快</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span></td>
<td>单向链表</td>
<td>只支持双向顺序访问</td>
<td>在链表的任何位置进行插入 / 删除操作速度都很快</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span></td>
<td>固定大小数组</td>
<td>支持快速随机访问</td>
<td>不能添加或删除元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span></td>
<td>与 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 相似容器</td>
<td>专门用于保存字符</td>
<td>在尾部插入 / 删除速度都很快</td>
</tr>
</tbody>
</table></div>
<h3 id="2">2. 容器基本操作</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>容器基本操作</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>类型别名</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>iterator</code></span></td>
<td>此容器类型的迭代器类型</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>const_iterator</code></span></td>
<td>可以读取元素，但不能修改元素的迭代器类型</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>size_type</code></span></td>
<td>无符号整数类型，足够保存此种容器类型最大可能容器的大小</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>difference_type</code></span></td>
<td>带符号整数类型，足够保存两个迭代器之间的距离</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>value_type</code></span></td>
<td>元素类型</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>reference</code></span></td>
<td>元素的左值特性：与 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>value_type&amp;</code></span> 含义相同</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>const_reference</code></span></td>
<td>元素的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>const</code></span> 左值类型（即，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>const value_type&amp;</code></span>）</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>构造函数</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>C c;</code></span></td>
<td>默认构造函数，构造空容器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>C c1(c2)</code></span></td>
<td>构造 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c2</code></span> 的拷贝 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c1</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>C c(b, e)</code></span></td>
<td>构造 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span>，将迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 指定的范围内的元素拷贝到 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span>（<span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span> 不支持）</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>C c{a, b, c...}</code></span></td>
<td>列表初始化 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>赋值与swap</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c1 = c2</code></span></td>
<td>将 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c1</code></span> 中的元素替换为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c2</code></span> 中元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c1 = {a, b, c...}</code></span></td>
<td>将 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c1</code></span> 中的元素替换为列表中元素（不适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span>）</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>a.swap(b)</code></span></td>
<td>交换 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>a</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 的元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>swap(a, b)</code></span></td>
<td>与 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>a.swap(b)</code></span> 等价（全局模版函数）</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>大小与判空</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.size()</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中元素的数组（不支持 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span>）</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.max_size()</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中可保存的最大元素数目</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.empty()</code></span></td>
<td>若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中存储了元素，返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>false</code></span>，否则返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>true</code></span></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>添加/删除元素</strong></td>
<td><strong>（不适用于array）</strong></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(args)</code></span></td>
<td>将 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 中的元素拷贝进 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace(inits)</code></span></td>
<td>使用 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>inits</code></span> 构造 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中的一个元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(args)</code></span></td>
<td>删除 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 指定的元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.clear()</code></span></td>
<td>删除 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中的所有元素，返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>void</code></span></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>关系运算符</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>==, !=</code></span></td>
<td>所有容器都支持相等（不等运算符）</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>&lt;,&lt;=,&gt;,&gt;=</code></span></td>
<td>关系运算符（无序关联容器不支持）</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>迭代器</strong></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.begin(), c.end()</code></span></td>
<td>返回指向 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的首元素和尾元素之后位置的迭代器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.cbengin(),c.cend()</code></span></td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>const_iterator</code></span></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>反向容器的额外成员</strong></td>
<td><strong>（不支持forward_list）</strong></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>reverse_iterator</code></span></td>
<td>按逆序寻址元素的迭代器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>const_reverse_iterator</code></span></td>
<td>不能修改元素的逆序迭代器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.rbegin(), c.rend()</code></span></td>
<td>返回指向 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的尾元素和首元素之前位置的迭代器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.crbegin(), c.crend()</code></span></td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>const_reverse_iterator</code></span></td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>emplace</code></span> 函数直接在容器中构造函数，不是拷贝。</p>
</blockquote>
<h3 id="3">3. 添加元素</h3>
<ul>
<li>这些操作会改变容器的大小; </li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span> 不支持这些操作。</li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span> 有自己专有版本的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>insert</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>emplace</code></span>; 参见9.3.4节(第312页)。</li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span> 不支持 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>push_back</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>emplace_back</code></span>。</li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span> 不支持 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>push_front</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>emplace_front</code></span>。</li>
</ul>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>方法</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.push_back(t)</code></span></td>
<td>在 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的尾部创建一个值为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>t</code></span> 或由 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 创建的元素。<br />返回 void</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace_back(args)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.push_front(t)</code></span></td>
<td>在 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的头部创建一个值为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>t</code></span> 或由 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 创建的元素。<br />返回 void</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace_front(args)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(p,t)</code></span></td>
<td>在迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指向的元素之前创建一个值为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>t</code></span> 或由 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 创建的元素。<br />返回指向新添加的元素的迭代器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace(p,args)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(p,n,t)</code></span></td>
<td>在迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指向的元素之前插入 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个值为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>t</code></span> 的元素。<br />返回指向新添加的第一个元素的迭代器<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 为 0，则返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(p,b,e)</code></span></td>
<td>将迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 指定的范围内的元素插入到迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指向的元素之前。<br /><span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 不能指向 c 中的元素。<br />返回指向新添加的第一个元素的迭代器，若范围为空，则返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(p,il)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>il</code></span> 是一个花括号包围的元素值列表。<br />将这些给定值插入到迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指向的元素之前。<br />返回指向新添加的第一个元素的迭代器；<br/>若列表为空，则返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span></td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p>警告：向一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span> 或 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span> 插入元素，会使所有指向容器的迭代器、引用和指针失效。</p>
</blockquote>
<h3 id="4">4. 访问元素</h3>
<ul>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>at</code></span> 和下标操作只适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span></li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>back</code></span> 不适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>forwaed_list</code></span></li>
</ul>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>访问元素</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.back()</code></span></td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中尾元素的引用。</td>
<td>若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 为空，函数行为未定义</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.front()</code></span></td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中首元素的引用。</td>
<td>若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 为空，哈数行为未定义</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c[n]</code></span></td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中下标为n的元素的引用，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 是一个无符号整数。</td>
<td>若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n&gt;=size()</code></span>，则函数行为未定义</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.at[n]</code></span></td>
<td>返回下标为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 的元素的引用。</td>
<td>如果下标越界，则抛出 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>out_of_range</code></span> 异常</td>
</tr>
</tbody>
</table></div>
<h3 id="5">5. 删除元素</h3>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>删除元素</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.pop_back()</code></span></td>
<td>删除 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中尾元素。返回返回void</td>
<td>若c为空，则函数行为未定义。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.pop_front()</code></span></td>
<td>删除 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中首元素。返回void</td>
<td>若c为空，则函数行为未定义。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(p)</code></span></td>
<td>删除迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 所指定的元素，返回一个指向被删除元素之后元素的迭代器，<br />如p指向尾元素，则返回尾后 (<span style="overflow-x: auto; max-width:100%; display:inline;"><code>off-the-end</code></span>) 迭代器。</td>
<td>若p是尾后迭代器，则函数行为未定义</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(b, e)</code></span></td>
<td>删除迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 所指定范围内的元素。<br />返回一个指向最后一个被删除元素之后元素的迭代器。<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 本身就是尾后迭代器，则函数也返回尾后迭代器。</td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.claer()</code></span></td>
<td>删除 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中的所有元素。返回void</td>
<td></td>
</tr>
</tbody>
</table></div>
<h3 id="6">6. 改变容器的大小</h3>
<ul>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>rasize</code></span> 不适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span></li>
</ul>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>大小操作</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.resize(n)</code></span></td>
<td>调整 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的大小为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个元素。<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n &lt; c.size()</code></span>，则多出的元素被丢弃。<br />若必须添加新元素，对新元素进行值初始化。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.resiae(n,t)</code></span></td>
<td>调整 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 的大小为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个元素。<br />任何新添加的元素都初始化为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>t</code></span></td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p>警告：</p>
<p>如果 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>resize</code></span> 缩小容器，则指向被删除元素的迭代器、引用和指针都会失效；</p>
<p>对 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span> 或 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span> 进行 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>resize</code></span> 可能导致迭代器、引用和指针失效。</p>
</blockquote>
<h3 id="61">6.1 容器大小管理操作</h3>
<ul>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>shrink_to_fit</code></span> 只适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span>。.</li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>capacity</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>reserve</code></span> 只适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span>。</li>
</ul>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>容器大小管理操作</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.shrink_to_fit()</code></span></td>
<td>请将 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>capacity()</code></span> 减少为与 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>size()</code></span> 相同大小。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.capacity()</code></span></td>
<td>不重新分配内存空间的话，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 可以保存多少元素。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.reserve(n)</code></span></td>
<td>分配至少能容纳 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个元素的内存空间。</td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>reserve</code></span> 并不改变容器中元素的数量，它仅影响 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 预先分配多大的存储空间。</p>
<p>只有当需要的内存空间超过当前容量时，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>reserve</code></span> 调用才会改变 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 的容量。</p>
<ul>
<li>当需求大小小于或等于当前容量，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>reserve</code></span> 什么也不做。</li>
<li>当需求大小大于当前容量时，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>reserve</code></span> 至少分配与需求一样大的内存空间（可能更大）。</li>
</ul>
</blockquote>
<h3 id="7">7. 容器详细介绍</h3>
<h4 id="71-vector">7.1 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span></h4>
<h5 id="711-vector">7.1.1 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span> 对象的内存增长方式</h5>
<ul>
<li>初始时，一个空的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>vector</code></span>，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>size()</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>capacity()</code></span> 均为 0</li>
<li>在每次需要分配新内存空间时将当前容量翻倍。</li>
</ul>
<h4 id="72-deque">7.2 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span></h4>
<h4 id="73-list">7.3 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>list</code></span></h4>
<h4 id="74-forward_list">7.4 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>forward_list</code></span></h4>
<h4 id="75-array">7.5 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>array</code></span></h4>
<h4 id="76-string">7.6 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span></h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th><span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span> 的其他构造方式</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>string s(cp, n)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>s</code></span> 是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>cp</code></span> 指向的数组中前n个字符的拷贝。<br />此数组至少应该包含 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个字符。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>string s(s2, pos2)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>s</code></span> 是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string s2</code></span> 从下标 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos2</code></span> 开始的字符的拷贝。<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos2 &gt; s2.size()</code></span>，构造函数的行为未定义。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>string s(s2, pos2, len2)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>s</code></span> 是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string s2</code></span> 从下标 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos2</code></span> 开始 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>len2</code></span> 个字符的拷贝。<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos2 &gt; s2.size()</code></span>，构造函数的行为未定义。<br />不管 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>len2</code></span> 的值是多少，构造函数至多拷贝 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>s2.size()-pos2</code></span> 个字符。</td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span>、<span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos2</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>len2</code></span> 都是无符号值。</p>
</blockquote>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>子字符串操作</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>s.substr(pos, n)</code></span></td>
<td>返回一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>string</code></span>，包含 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>s</code></span> 从 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos</code></span> 开始的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 个字符的拷贝。<br /><span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos</code></span> 的默认值为 0。<br /><span style="overflow-x: auto; max-width:100%; display:inline;"><code>n</code></span> 的默认值为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>s.size()-pos</code></span>，即拷贝从 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pos</code></span> 开始的所有字符。</td>
</tr>
</tbody>
</table></div>
<h2 id="_2">二、关联容器</h2>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>关联容器</th>
<th>内容</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span></td>
<td>关联数组，保存 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair{关键字, 值对}</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span></td>
<td>值保存关键字的容器</td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>multimap</code></span></td>
<td>关键字可重复出现的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span></td>
<td>关键字可以重复出现</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>multiset</code></span></td>
<td>关键字可重复出现的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span></td>
<td>关键字可以重复出现</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>unordered_map</code></span></td>
<td>用 <strong>哈希</strong> 函数组织的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>unordered_set</code></span></td>
<td>用 <strong>哈希</strong> 函数组织的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>unordered_multimap</code></span></td>
<td>用 <strong>哈希</strong> 函数组织的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span></td>
<td>关键字可以重复出现</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>unordered_multiset</code></span></td>
<td>用 <strong>哈希</strong> 函数组织的 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span></td>
<td>关键字可以重复出现</td>
</tr>
</tbody>
</table></div>
<h3 id="1_1">1. 关联容器概述</h3>
<h4 id="11">1.1 定义关联容器</h4>
<p>定义 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span> 时，必须指明关键字类型又指明值类型；</p>
<p>定义 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span> 时，只需指明关键字类型。</p>
<h4 id="12-pair">1.2 pair 类型</h4>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span> 标准库类型定义在头文件 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>utility</code></span> 中。</p>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span> 保存两个数据成员。当创建一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span> 时，必须提供两个类型名。</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">pair&lt;string, string&gt; anon; // 保存两个string
pair&lt;string, string&gt; author{&quot;James&quot;, &quot;Joyce&quot;}; // 也可为每个成员提供初始化器
</code></span></code></pre>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span> 的数据类型是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>public</code></span> 的，两个成员分别命名为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>first</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>second</code></span>。</p>
<h4 id="13">1.3 关联容器额外的类型别名</h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>关联容器额外的类型别名</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>key_type</code></span></td>
<td>此容器类型的关键字类型</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>mapped_type</code></span></td>
<td>每个关键字关联的类型，只适用于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>value_type</code></span></td>
<td>对于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>set</code></span>，此容器类型的关键字类型；<br />对于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span>，为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair&lt;const key_type, mapped_type&gt;</code></span></td>
</tr>
</tbody>
</table></div>
<h4 id="14">1.4 关联容器迭代器</h4>
<p>set 的迭代器是 const 的。</p>
<p>map 和 set 的关键字都是 const 的。</p>
<p><strong>遍历关联容器</strong>：</p>
<p>map 和 set 都支持 begin 和 end 操作。使用 beigin、end 获取迭代器，然后用迭代器来遍历容器。</p>
<h4 id="15">1.5 添加元素</h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>方法</th>
<th>注意</th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(v)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>v</code></span> 是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>value_type</code></span> 类型的对象</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace(args)</code></span></td>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>args</code></span> 用来构造一个元素</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(b, e)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(il)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.insert(p, v)</code></span></td>
<td></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.emplace(p ,args)</code></span></td>
<td></td>
</tr>
</tbody>
</table></div>
<h4 id="16">1.6 删除元素</h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>方法</th>
<th>含义</th>
<th>返回</th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(k)</code></span></td>
<td>从 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中删除每个关键字为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素。</td>
<td>一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>size_type</code></span> 值，指出删除的元素的数量</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(p)</code></span></td>
<td>从 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中删除迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指定的元素。<span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 必须指向 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中一个真实元素，不能等于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.end()</code></span>。</td>
<td>返回一个指向 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 之后元素的迭代器。<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>p</code></span> 指向 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中的尾元素，则返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>.end()</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.erase(b, e)</code></span></td>
<td>删除迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>b</code></span> 和 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span> 所表示的范围中的元素。</td>
<td>返回 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>e</code></span></td>
</tr>
</tbody>
</table></div>
<h4 id="17-map-unordered_map">1.7 map 和 unordered_map 的下标操作</h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>方法</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c[k]</code></span></td>
<td>返回关键字为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素；<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 不在 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中，添加一个关键字为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素，对其进行值初始化。</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.at[k]</code></span></td>
<td>访问关键字为 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素，带参数检查；<br />若 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 不在 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c</code></span> 中，抛出一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>out_of_range</code></span> 异常。</td>
</tr>
</tbody>
</table></div>
<blockquote class="content-quote">
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>map</code></span> 进行下标操作，会获得 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>mapped_type</code></span> 对象；</p>
<p>当解引用时，会得到 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>value_type</code></span> 对象。</p>
</blockquote>
<h4 id="18">1.8 访问元素</h4>
<div class="pure-table-scrollable"><table class="pure-table pure-table-horizontal">
<thead>
<tr>
<th>方法</th>
<th>含义</th>
<th>注意</th>
</tr>
</thead>
<tbody>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.find(k)</code></span></td>
<td>返回一个迭代器，指向第一个关键字 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素。</td>
<td>如 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 不在容器中，则返回尾后迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>.end()</code></span></td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.count(k)</code></span></td>
<td>返回关键字等于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素的数量。</td>
<td>对于不允许重复关键字的容器，返回值永远是 0或 1</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.lower_bound(k)</code></span></td>
<td>返回一个迭代器，指向第一个关键字 <strong>不小于</strong> <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素。</td>
<td>不适用于无序容器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.upper_bound(k)</code></span></td>
<td>返回一个迭代器，指向第一个关键字 <strong>大于</strong> <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素。</td>
<td>不适用于无序容器</td>
</tr>
<tr>
<td><span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.equal_bound(k)</code></span></td>
<td>返回一个迭代器 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span>，表示关键字 <strong>等于</strong> <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 的元素的范围。</td>
<td>如 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>k</code></span> 不存在，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>pair</code></span> 的两个成员均等于 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>c.end()</code></span></td>
</tr>
</tbody>
</table></div>
<h2 id="_3">三、仿函数</h2>
<blockquote class="content-quote"></blockquote>
<p><strong>function call operator</strong> 仿函数中的函数名，是一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>operator()</code></span></p>
<p>仿函数主要是用来服务算法的，如果要被算法调用就需要重载 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>()</code></span>。这里称这种<span style="overflow-x: auto; max-width:100%; display:inline;"><code>()</code></span>为 <strong>function call operator</strong></p>
<p>仿函数主要分为三大类：</p>
<p>算术类</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;class T&gt;
struct plus : public binary_function&lt;T, T, T&gt; {
    T operator()(const T&amp; x, const T &amp; y) const { return x + y;}
};
</code></span></code></pre>
<p>逻辑运算类</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;class T&gt;
struct logical_and: public binary_function&lt;T, T, bool&gt; {
    bool operator()(const T&amp; x, const T&amp; y) const {return x &amp;&amp; y;}
}
</code></span></code></pre>
<p>相对关系类</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;class T&gt;
struct equal_to : public binary_function&lt;T, T, bool&gt; {
    bool operator()(const T&amp; x, const T&amp; y) const {return x == y;}
}
</code></span></code></pre>
<p>为什么需要继承  <span style="overflow-x: auto; max-width:100%; display:inline;"><code>binary_function</code></span> ？</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;class Arg1, class Arg2, class Reuslt&gt;
struct binary_function{
    typedef Arg1 first_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};
</code></span></code></pre>
<blockquote class="content-quote">
<p>标准 C++ 库根据 operator() 参数个数加以划分，主要有以下几种类型：</p>
<p>1  发生器：一种没有参数且返回一个任意类型值的函数对象，例如随机数发生器。</p>
<p>2  一元函数：一种只有一个任意类型的参数，且返回一个可能不同类型值的函数对象。</p>
<p>3  二元函数：一种有两个任意类型的参数，且返回一个可能不同类型值的函数对象。</p>
<p>4  一元判定函数：返回bool型值的一元函数。</p>
<p>5  二元判定函数：返回bool型值的二元函数。</p>
</blockquote>
<p>通过继承 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>binay_function</code></span> ，仿函数获取到了一些 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>typedef</code></span>，而这些 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>typedef</code></span> 会被适配器所需要。</p>
<h2 id="adapter">四、适配器 Adapter</h2>
<p>根据目标接口的类型，适配器可分为以下几类：</p>
<p>改变容器的接口，称为容器适配器；</p>
<p>改变迭代器的接口，称为迭代器适配器；</p>
<p>改变仿函数的接口，称为仿函数适配器。</p>
<h3 id="1_2">1. 容器适配器：用于改造容器</h3>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>stack</code></span>，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>queue</code></span> 都内含了一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span></p>
<p><span style="overflow-x: auto; max-width:100%; display:inline;"><code>stack</code></span>，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>queue</code></span> 的功能都是由 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span> 实现的，所有<span style="overflow-x: auto; max-width:100%; display:inline;"><code>stack</code></span>，<span style="overflow-x: auto; max-width:100%; display:inline;"><code>queue</code></span> 是 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>deque</code></span> 的容器适配器。</p>
<h3 id="2_1">2. 仿函数适配器：用于改造仿函数</h3>
<p>STL 提供每个 Adaptable Function 都应挑选适当者继承（因为Function Adapter 将会提问）。</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">templdate&lt;class Arg1, classs Arg2, class Result&gt;
struct binary_function{
    typedef Arg1 Frist_argument_type;
    typedef Arg2 second_argument_type;
    typedef Result result_type;
};

templdate &lt;class T&gt;
struct less : public binary_function&lt;T, T, bool&gt; {
    bool operator()(const T&amp; x, const T&amp; y) const { return x  &lt; y; }
};
</code></span></code></pre>
<p>上面是仿函数以及基类定义。</p>
<p>这些在 <strong>仿函数适配器 </strong>中会被用到。</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">// typename+() == 产生一个临时对象，less&lt;int&gt;()就是一个仿函数对象
bind2nd(less&lt;int&gt;(), 40);
// 本来是用来比大小 (x &lt; y) 的，被 bing2nd 修饰了之后，函数功能发生了变化。
template &lt;class T&gt; less&lt;int T&gt;{}
// 现在函数的功能为 (x &lt; 40)
</code></span></code></pre>
<h4 id="11_1">1.1 新型适配器</h4>
<p><strong>std::bind</strong> 绑定函数，可以绑定下面 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>object</code></span></p>
<ol>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>functions</code></span></li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>function objects</code></span></li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>member functions</code></span>, <span style="overflow-x: auto; max-width:100%; display:inline;"><code>_1</code></span> 必须是某个 object 地址</li>
<li><span style="overflow-x: auto; max-width:100%; display:inline;"><code>data members</code></span>， <span style="overflow-x: auto; max-width:100%; display:inline;"><code>_1</code></span> 必须是某个object 地址</li>
</ol>
<p>这个函数呢，会返回一个 <span style="overflow-x: auto; max-width:100%; display:inline;"><code>function object ret</code></span>。调用<span style="overflow-x: auto; max-width:100%; display:inline;"><code>ret</code></span> 相当于调用上述1， 2， 3， 或相当于取出 4</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">#include &lt;iostream&gt;     // std::cout, std::boolalpha
#include &lt;functional&gt;   // std::is_placeholder, std::placeholders

using namespace std::placeholders;

vector&lt;int&gt; v {51, 52, 40, 20, 70, 20, 59};

cout &lt;&lt; count_if(v.cbegin(), v.cend(), bind(less&lt;int&gt;(), _1, 50)) &lt;&lt; endl;
cout &lt;&lt; count_if(v.cbegin(), v.cend(), bind2nd(less&lt;int&gt;(), 50)) &lt;&lt; endl; 
// bind2nd 将 50 绑定为第二个参数，即 less 函数的作用是判断 x &lt; 50
</code></span></code></pre>
<h3 id="3_1">3. 迭代器适配器：用于改造迭代器</h3>
<h4 id="31-tuple">3.1 tuple</h4>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;typename... Values&gt; class tuple;
template &lt;&gt; class tuple&lt;&gt;{};

template &lt;typename Head, typename... Tail&gt;
class tuple&lt;Head, Tail...&gt; : private tuple&lt;Tail...&gt;
{
    typedef tuple&lt;Tail...&gt; inherited;
public:
    tuple(){}
    tuple(Head v, Tail... vtail)
        : m_head(v), inherited(vtail...){}

    typename Head::type head() { return m_head;}
    inherited&amp; tail() { return *this; } //return 后，转型为 inherited，实际获得的是 Tail...

protected:
    Head m_head;
};
</code></span></code></pre>
<p>tuple 一种类似于 pair 的集合型容器类。可以将不同类似的对象包装到一起。应该是可以包含无限的对象。</p>
<p><strong>实现方式</strong>：通过递归继承来实现。</p>
<h4 id="32-traits">3.2 Traits</h4>
<p>traits 获取对象的类型。</p>
<p><strong>实现格式：</strong> 模板的泛化和特化。</p>
<pre><code class="pre-wrap"><span style="overflow-x: auto; max-width:100%; display:inline;"><code class="language-c++">template &lt;typename _Tp&gt;
struct remove_const                  { typedef _Tp type; };

template &lt;typename _Tp&gt;
struct remove_const&lt;const _Tp&gt;       { typedef _Tp type; };

template &lt;typename _Tp&gt;
struct remove_volatile               { typedef _Tp type; };

template &lt;typename _Tp&gt;
struct remove_volatile&lt;volatile _Tp&gt; { typedef _Tp type; };

/*
 * 将传入的`const volatile Type` 去掉 const 和 volatile ，还原原始的类型
 */

template &lt;typename _Tp&gt;
struct remove_cv{
    typedef typename remove_const&lt;typename remove_volatile&lt;_Tp&gt;::type&gt;::type type;
};

template&lt;typename&gt;
struct __is_void_helper : public false_type{};

template&lt;typename&gt;
struct __is_void_helper&lt;void&gt; : public true_type{};

template &lt;typename _Tp&gt;
struct is_void : public __is_void_helper&lt;typename remove_cv&lt;_Tp&gt;::type&gt;::type {};
</code></span></code></pre>
  </div>
</div>
 
    </div>
  </div>
  <div id="footer-background">
    <div id="footer">
      <div class="legal pure-g">
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-license"><a href="https://beian.miit.gov.cn/#/Integrated/index">浙ICP备2020038748号</a></p>
  </div>
  <div class="pure-u-1 u-sm-1-2">
    <p class="legal-links"><a href="https://github.com/zromyk">GitHub</a></p>
    <p class="legal-copyright">Copyright © 2021 Wei Zhou. 保留所有权利。</p>
  </div>
</div>
    </div>
  </div>
  <!-- <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> -->
  <script src="/style/html/jquery.min.js"></script>
  <script src='/style/article/latex/latest.js?config=TeX-MML-AM_CHTML'></script>
<!-- <script src="https://cdn.geogebra.org/apps/deployggb.js"></script> -->
<script src="/style/article/deployggb.js"></script>
<!-- <script src="https://apps.bdimg.com/libs/highlight.js/9.1.0/highlight.min.js"></script> -->
<script type="text/javascript">
  // 脚本：navigation 随鼠标移动自动变换宽度
  var element = document.getElementById("navigation"); // 获取要操作的元素
  var elementWidth = parseInt(getComputedStyle(element).width);
  var elementLeft = 0;
  var elementRight = 0;
  element.addEventListener('mouseenter', function (event) { // 添加鼠标按下事件的监听器
    elementLeft = element.getBoundingClientRect().left - 10;
    elementRight = element.getBoundingClientRect().left + elementWidth * 3;
    window.addEventListener('mousemove', resize); // 添加全局的鼠标移动事件的监听器
  });

  function resize(event) {
    var minWidth = elementWidth;
    var maxWidth = elementWidth * 2.5;
    // console.log(elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    if (elementLeft <= event.clientX && event.clientX <= elementRight) {
      var width = event.clientX - elementLeft + elementWidth / 2;
      width = Math.min(width, maxWidth);
      width = Math.max(width, minWidth);
      element.style.width = width + 'px'; // 设置新的宽度样式属性
    }
    else {
      element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
      stopResize();
    }
  }

  function stopResize() {
    element.style.width = elementWidth + 'px'; // 设置新的宽度样式属性
    // console.log("stopResize", elementLeft, event.clientX, elementRight, event.clientX - elementLeft + elementWidth / 2);
    window.removeEventListener('mousemove', resize); // 移除鼠标移动事件的监听器
  }
</script>
<script src="/style/article/highlight/highlight.min.js"></script>
<script type="text/javascript">
  // 脚本：code语法高亮
  hljs.initHighlightingOnLoad();
</script>
<script>
  function animateByNav() {
    $("html").animate({
        scrollTop: ($(event.target.hash).offset().top - 52)
    }, 300);
  };
</script>
<script src="/style/article/pell-1.0.6/dist/pell.js"></script>
<script>
  // 脚本：自由编辑页面
  var editor = window.pell.init({
    element: document.getElementById('editor'),
    defaultParagraphSeparator: 'p',
    onChange: function(html) {
        document.getElementById('text-output').innerHTML = html
        document.getElementById('html-output').textContent = html
    }
  });

  function markdownEditor() {
    var articles = document.getElementById('content-articles-markdown');
    if (articles.getAttribute("contenteditable") == "true") {
        articles.setAttribute("contenteditable", "false");
        document.getElementById("content-articles-markdownEditor").style.display = "none"; //隐藏
        document.getElementById("button-markdownEditor").innerHTML = "启用编辑";
    } else {
        articles.setAttribute("contenteditable", "true");
        document.getElementById("content-articles-markdownEditor").style.display = ""; //显示
        document.getElementById("button-markdownEditor").innerHTML = "关闭编辑";
    }
  };

  function save() {
      window.alert("保存成功");
  };
</script>

</body>
</html>
